﻿<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>LIMIT 和 OFFSET</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="queries-order.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="queries.html">快退</a></td><td width="60%" align="center" valign="bottom">章7. 查询</td><td width="10%" align="right" valign="top"><a href="queries.html">快进</a></td><td width="10%" align="right" valign="top"><a href="queries-values.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="QUERIES-LIMIT">7.6. <tt class="LITERAL">LIMIT</tt> 和 <tt class="LITERAL">OFFSET</tt></a></h1><a name="AEN3588"></a><a name="AEN3590"></a>
<p><tt class="LITERAL">LIMIT</tt> 和 <tt class="LITERAL">OFFSET</tt> 子句允许你只取出查询结果中的一部分数据行：</p>
<pre class="SYNOPSIS">SELECT <tt class="REPLACEABLE"><i>select_list</i></tt>
    FROM <tt class="REPLACEABLE"><i>table_expression</i></tt>
    [<span class="OPTIONAL">ORDER BY <tt class="REPLACEABLE"><i>sort_expression1</i></tt> [<span class="OPTIONAL">ASC | DESC</span>] [<span class="OPTIONAL">, <tt class="REPLACEABLE"><i>sort_expression2</i></tt> [<span class="OPTIONAL">ASC | DESC</span>] ...</span>]</span>]
    [<span class="OPTIONAL">LIMIT { <tt class="REPLACEABLE"><i>number</i></tt> | ALL }</span>] [<span class="OPTIONAL">OFFSET <tt class="REPLACEABLE"><i>number</i></tt></span>]</pre>
<p>如果给出了一个 <tt class="LITERAL">LIMIT</tt> 计数，那么将返回不超过该数字的行(也可能更少些，因为可能查询本身生成的总行数就比较少)。<tt class="LITERAL">LIMIT ALL</tt> 和省略 <tt class="LITERAL">LIMIT</tt> 子句是一样的。</p>
<p><tt class="LITERAL">OFFSET</tt> 指明在开始返回行之前忽略多少行。<tt class="LITERAL">OFFSET 0</tt> 和省略 <tt class="LITERAL">OFFSET</tt> 子句是一样的。如果 <tt class="LITERAL">OFFSET</tt> 和 <tt class="LITERAL">LIMIT</tt> 都出现了，那么在计算 <tt class="LITERAL">LIMIT</tt> 之前先忽略 <tt class="LITERAL">OFFSET</tt> 指定的行数。</p>
<p>使用 <tt class="LITERAL">LIMIT</tt> 的同时使用 <tt class="LITERAL">ORDER BY</tt> 子句把结果行约束成一个唯一的顺序是一个好主意。否则你就会的到一个不可预料的子集。你要的可能是第十到二十行，但以什么顺序的十到二十？除非你声明了 <tt class="LITERAL">ORDER BY</tt> ，否则顺序是未知的。</p>
<p>查询优化器在生成查询规划的时候会考虑 <tt class="LITERAL">LIMIT</tt> ，因此如果你给 <tt class="LITERAL">LIMIT</tt> 和 <tt class="LITERAL">OFFSET</tt> 的值不同，那么你很可能得到不同的规划(产生不同的行顺序)。因此，使用不同的 <tt class="LITERAL">LIMIT</tt>/<tt class="LITERAL">OFFSET</tt> 值选择不同的子集<span class="emphasis"><i class="EMPHASIS">将生成不一致的结果</i></span>，除非你用 <tt class="LITERAL">ORDER BY</tt> 强制一个可预料的顺序。这可不是臭虫，而是一个很自然的结果，因为 SQL 没有许诺把查询的结果按照任何特定的顺序发出，除非用了 <tt class="LITERAL">ORDER BY</tt> 来约束顺序。</p>
<p><tt class="LITERAL">OFFSET</tt> 子句忽略的行仍然需要在服务器内部计算；因此，一个很大的 <tt class="LITERAL">OFFSET</tt> 可能还是不够有效率。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="queries-order.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="queries-values.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">行排序</td><td width="34%" align="center" valign="top"><a href="queries.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top"><tt class="LITERAL">VALUES</tt> 列表</td></tr>
</table>
</div>
</body></html>